home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Special 25 / AMIGAplus Sonderheft 25 (2000)(Falke)(DE)(Track 1 of 4)[!].iso / Updates / HD-Installer / jst_dev / sources / src / DiskTools / robdecode.asm < prev   
Assembly Source File  |  2000-04-12  |  3KB  |  228 lines

  1.     XDEF    _DecodeTrack
  2.     XDEF    DecodeTrack
  3.  
  4. RESYNC_LEN = $1A00
  5. SYNC_WORD =$1448
  6.  
  7. start:
  8.     move.l    #dectrack,A0
  9.     move.l    #rawtrack,D0
  10.     move.l    diskkey,D1
  11.     bsr    DecodeTrack
  12.     rts
  13.  
  14. ResyncTrack:
  15.     move.l    RawBuffer(pc),A0
  16.     move.l    Shift(pc),D0
  17.     move.l    #RESYNC_LEN,D1
  18.     subq.l    #6,A0
  19.     lea    synctrack,A1
  20. st_loop:
  21.     move.l    (A0),D2
  22.     lsr.l    D0,D2
  23.     addq.l    #2,A0
  24.     move.w    D2,(A1)+
  25.     dbf    D1,st_loop
  26.     rts
  27.  
  28. ; ** C entrypoint
  29.  
  30. _DecodeTrack:
  31.     move.l    4(A7),D0    ; raw buffer
  32.     move.l    8(A7),A0    ; destination (decoded)
  33.     move.l    12(A7),D1    ; disk key
  34.  
  35. ; ** assembly entrypoint
  36.  
  37. DecodeTrack:
  38.     movem.l    D1-A6,-(sp)
  39.  
  40.     move.l    A0,A1    ; dec
  41.     move.l    D0,A0    ; raw
  42.  
  43.     move.l    D1,diskkey
  44.  
  45.     bsr    GetSync
  46.     tst.l    D0
  47.     bne    syncerr
  48.  
  49.     move.l    A1,DecodedBuffer
  50.     move.l    A0,RawBuffer
  51.     move.l    D1,Shift
  52.  
  53.     bsr    ResyncTrack
  54.  
  55.     move.l    DecodedBuffer,A2
  56.     lea    synctrack+4,A5
  57.     
  58.     bsr    Decode
  59.  
  60. exit:
  61.  
  62.     movem.l    (sp)+,D1-A6
  63.     rts
  64.  
  65.  
  66. decodeerr
  67.     moveq    #-1,D0
  68.     rts
  69.  
  70. decodeerr2
  71.     moveq    #1,D0
  72.     add.w    sectorcount,D0
  73.     rts
  74.  
  75. syncerr
  76.     moveq    #-2,D0
  77.     bra    exit
  78.  
  79. Decode:
  80.  
  81. sks:
  82.     CMPI.W    #SYNC_WORD,(A5)
  83.     bne    go
  84.     addq.l    #2,A5
  85.     bra    sks
  86. go:
  87.     CMPI.W    #$4891,(A5)
  88.     BNE.W    decodeerr
  89.  
  90.     clr.l    sectorcount
  91.  
  92. LB_DFFA:
  93.     LEA    $0002(A5),A0
  94.     MOVE.L    (A0)+,D0
  95.     MOVE.L    (A0)+,D1
  96.     ANDI.L    #$55555555,D0
  97.     ANDI.L    #$55555555,D1
  98.     ADD.L    D0,D0
  99.     OR.L    D1,D0
  100.     MOVE.L    diskkey,D1
  101.     BSET    #$1F,D1
  102.     EOR.L    D1,D0
  103.     MOVE.L    D0,D3
  104.     SWAP    D0
  105.     LSR.W    #8,D0
  106.  
  107.     LEA    $000A(A5),A0
  108.     BSR.B    ChecksumZone
  109.     CMP.W    D0,D3
  110.     BNE.B    decodeerr2
  111.     MOVE.L    A2,A1
  112.     BSR.B    DecodeZone
  113.     LEA    $0200(A2),A2
  114.  
  115. LB_E066
  116.     ADDA.W    #$040A,A5
  117.     MOVE.W    (A5)+,D0
  118.     MOVEQ    #$00,D1
  119.     MOVEQ    #$07,D2
  120. LB_E070    ROXL.W    #2,D0
  121.     ROXL.B    #1,D1
  122.     DBF    D2,LB_E070
  123.  
  124.     ADD.W    D1,D1
  125.     ADDA.L    D1,A5
  126.     ADDQ.W    #1,sectorcount
  127.     CMPI.W    #$000C,sectorcount
  128.     BNE.W    LB_DFFA
  129.     MOVEQ.L    #$0,D0
  130.     RTS    
  131.  
  132. ChecksumZone
  133.     MOVEM.L    D1/D2/A0,-(A7)
  134.     MOVEQ    #$00,D0
  135.     MOVE.W    #$00FF,D1
  136. LB_E0BC    MOVE.L    (A0)+,D2
  137.     EOR.L    D2,D0
  138.     DBF    D1,LB_E0BC
  139.     ANDI.L    #$55555555,D0
  140.     MOVE.L    D0,D1
  141.     SWAP    D1
  142.     ADD.W    D1,D1
  143.     OR.W    D1,D0
  144.     MOVEM.L    (A7)+,D1/D2/A0
  145.     RTS
  146.  
  147. DecodeZone
  148.     MOVEM.L    D0-D4/A0-A2,-(A7)
  149.     MOVEQ    #$7F,D0
  150.     LEA    $0200(A0),A2
  151.     MOVE.L    #$55555555,D3
  152.     MOVE.L    diskkey,D4
  153. LB_E0EC    MOVE.L    (A0)+,D1
  154.     MOVE.L    (A2)+,D2
  155.     AND.L    D3,D1
  156.     AND.L    D3,D2
  157.     ADD.L    D1,D1
  158.     OR.L    D2,D1
  159.     EOR.L    D1,D4
  160.     MOVE.L    D4,(A1)+
  161.     MOVE.L    D1,D4
  162.     DBF    D0,LB_E0EC
  163.     MOVEM.L    (A7)+,D0-D4/A0-A2
  164.     RTS
  165.  
  166.     
  167. GetSync:
  168.     movem.l    D2-D6/A1-A6,-(sp)
  169.  
  170.     MOVE.L    A0,A2
  171.     lea    $7C00(A2),A4        ;end of rawtrack
  172.  
  173. .SHF2    MOVEQ.L    #$10-1,D5
  174.  
  175.     ; *** try to find the sync shift (0 to 15)
  176.  
  177. .SHF1    MOVE.L    (A2),D0        ; a longword of data
  178.     LSR.L    D5,D0        ; shift it by D5
  179.     CMP.W    #SYNC_WORD,D0    ; sync?
  180.     BEQ.S    .SY        ; yes: found sync AND shift
  181.     DBF    D5,.SHF1
  182.     ADDQ.L    #2,A2
  183.     cmp.l    A2,A4
  184.     beq    ErrorSyn
  185.     BRA.S    .SHF2
  186.  
  187.     ; ** shift has been found, sync too.
  188.  
  189. .SY    MOVE.L    (A2),D0
  190.     ADDQ.L    #2,A2
  191.     LSR.L    D5,D0            ;d5 is the shifting-number when sync was found
  192.     CMP.W    #SYNC_WORD,D0
  193.     BNE.S    .SY
  194.  
  195. .1    MOVE.L    (A2),D0
  196.     ADDQ.L    #2,A2
  197.     LSR.L    D5,D0
  198.     CMP.W    #SYNC_WORD,D0
  199.     BEQ.S    .1
  200.  
  201.     moveq    #0,D0
  202.     move.l    A2,A0    ; buffer synced
  203.     move.l    D5,D1    ; shift
  204.     bra    ExitSyn
  205.  
  206. ErrorSyn:
  207.     moveq.l    #-2,D0
  208. ExitSyn
  209.     movem.l    (sp)+,D2-D6/A1-A6
  210.     rts
  211. RawBuffer:
  212.     dc.l    0
  213. DecodedBuffer:
  214.     dc.l    0
  215. Shift:
  216.     dc.l    0
  217. diskkey:
  218.     dc.l    0
  219. sectorcount:
  220.     dc.l    0
  221. dectrack:
  222. ;;    blk.b    $1900,0
  223. rawtrack:
  224. ;;    incbin    "rob.raw"
  225.  
  226. synctrack:
  227.     blk.w    RESYNC_LEN+$100,0
  228.